package com.yunhe.authority.service.authority;

import com.yunhe.authority.domain.authority.Menu;
import com.yunhe.authority.domain.authority.MenuUnBindStationVo;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 菜单Service
 * @desc 菜单服务类定义
 * @author liuronglei
 */
public interface MenuService {

    /**
     * 新增菜单对象
     * @param menu 菜单对象
     * @param parentId 父菜单ID
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    Menu createMenu(Menu menu, Long parentId)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 删除菜单对象
     * @param menuId 菜单对象ID
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    void deleteMenu(Long menuId);

    /**
     * 删除多个菜单对象
     * @param menuIds 菜单对象ID列表
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    void deleteMenuByIds(String menuIds);

    /**
     * 更新菜单对象（更新全部字段）
     * @param menu 菜单对象
     * @param parentId 父菜单ID
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    Menu updateMenu(Menu menu, Long parentId)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 更新菜单对象（更新指定字段）
     * @param menuId 菜单ID
     * @param parentId 父菜单ID
     * @param name 菜单名
     * @param title 菜单标题
     * @param url 菜单Url
     * @param icon 图标
     * @param activity 是否可用
     * @param sn 排序
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    Menu updateMenu(Long menuId,
                    Long parentId,
                    String name,
                    String title,
                    String url,
                    String icon,
                    String activity,
                    String root,
                    String sn)
            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 更新父菜单关系
     * @param childId 子菜单ID
     * @param parentId 父菜单ID
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    void updateParent(Long childId, Long parentId) throws ObjectNotFoundException;

    /**
     * 根据菜单ID获得菜单对象
     * @param id 菜单ID
     */
    Menu findByMenuId(Long id);

    /**
     * 根据菜单编号获得菜单对象
     * @param name 菜单编号
     */
    Menu findByName(String name);

    /**
     * 获得所有菜单对象列表
     */
    Iterable<Menu> findMenus();

    /**
     * 根据项目ID或单位ID获取菜单对象列表
     */
    Iterable<Menu> findMenusByStationIdOrFirmId(Long stationId, Long firmId) throws ArgumentErrorException;

    /**
     * 根据项目id或者单位id再加上角色id查询菜单列表
     */
    Iterable<Menu> findMenusByStationIdOrFirmIdAndRoleId(Long stationId, Long firmId, Long roleId) throws ArgumentErrorException;

    /**
     * 根据用户ID获得菜单对象列表
     * @param userId 用户ID
     * @param firmCode 单位代码
     */
    Iterable<Menu> findMenusByUserId(Long firmCode, Long userId);

    /**
     * 根据用户ID获得App菜单对象列表
     * @param userId 用户ID
     * @param firmCode 单位代码
     */
    Iterable<Menu> findAppMenusByUserId(Long firmCode, Long userId);

    /**
     * 菜单绑定项目或单位
     * @param menuUnBindStationVo
     */
    @Transactional(rollbackFor = Exception.class, transactionManager = "transactionManager")
    void menusBindStationOrFirm(MenuUnBindStationVo menuUnBindStationVo) throws ObjectNotFoundException, ArgumentErrorException;

    /**
     * 根据角色ID获得菜单对象列表
     * @param roleIds 角色ID
     */
    List<Menu> findMenusByRoleId(String roleIds);

    List<Menu> findMenusBySystem(String systemMenuCategory);



    /****************************企业菜单******************************/

    /**
     * 根据企业ID获取菜单对象列表
     * @param companyId 企业id
     * @return Iterable<Menu>
     */
    List<Menu> findMenusByCompanyId(Long companyId);

    /**
     * 根据企业id以及角色id查询菜单列表
     * @param companyId
     * @param roleId
     * @return
     * @throws ArgumentErrorException
     */
    List<Menu> findMenusByCompanyIdAndRoleId(Long companyId, Long roleId) throws ArgumentErrorException;

    /**
     * 企业绑定菜单列表
     * @param ids 菜单列表id
     * @param companyId 企业id
     */
    void menusBindCompany(String ids, Long companyId, String systemMenuCategory);

    /**
     * 置顶菜单
     * @param id
     */
    void topMenu(Long id);
}
